package Define_generic_struct

import "fmt"

type Queue[T int | string | int32 | float32 | float64] struct {
	data []T
	size int
}

func (q *Queue[T]) push(ele T) *Queue[T] {
	q.data = append(q.data, ele)
	q.size++

	return q
}

func (q *Queue[T]) pop() *Queue[T] {
	q.data = q.data[1:]

	return q
}

func (q Queue[T]) getData() []T {
	return q.data
}

func (q Queue[T]) getDataSize() int {
	return q.size
}

func (q Queue[T]) top() T {
	return q.data[0]
}

func (q *Queue[T]) PrintData() {
	fmt.Println(q.data)
}

func GenericQueue() {
	q1 := Queue[int]{}
	q1.push(1).push(3).push(5)
	q1.PrintData()
	q1.pop()
	q1.PrintData()
	q1.push(7)
	q1.PrintData()

	fmt.Println("-----------------------------")

	q2 := Queue[string]{}
	q2.push("1").push("3").push("5")
	q2.PrintData()
	q2.pop()
	q2.PrintData()
	q2.push("7")
	q2.PrintData()

	fmt.Println("Test success!")
}
